# -*- coding: utf-8 -*-
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
#作者：cacho_37967865
#博客：https://blog.csdn.net/sinat_37967865
#文件：get_wechat_info.py
#日期：2018-05-19
#备注：只有登录微信才能获取到微信好友的信息，本文采用wxpy该第三方库进行微信的登录以及信息的获取。
       wxpy 在 itchat 的基础上，通过大量接口优化提升了模块的易用性，并进行丰富的功能扩展。
wxpy一些常见的场景：
    控制路由器、智能家居等具有开放接口的玩意儿
    运行脚本时自动把日志发送到你的微信
    加群主为好友，自动拉进群中
    跨号或跨群转发消息
    自动陪人聊天
    逗人玩
总而言之，可用来实现各种微信个人号的自动化操作。  
#词频统计：
pip3 install jieba(jieba（结巴）是一个强大的分词库，完美支持中文分词，结巴分词分为三种模式：精确模式（默认）、全模式和搜索引擎模式)
pip3 install pandas(pandas提供了使我们能够快速便捷地处理结构化数据的大量数据结构和函数)  
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
from wxpy import *
import re
import jieba
import pandas as pd
import os
from datetime import datetime
import csv

'''''''''''''''''''''''
wxpy中有一个机器人对象，机器人Bot对象可被理解为一个Web微信客户端。Bot在初始化时便会执行登陆操作，需要手机扫描登陆。
通过机器人对象Bot的chats(), friends()，groups(), mps()方法, 可分别获取到当前机器人的所有聊天对象、好友、群聊，以及公众号列表。
wxpy.api.chats.chats.Chats对象是多个聊天对象的合集，可用于搜索或统计，可以搜索和统计的信息包括:
sex(性别)、province(省份)、city(城市)和signature(个性签名)等。
'''''''''''''''''''''''
def login_chat():
    # 初始化机器人，扫码登陆
    bot = Bot()
    # 获取所有好友
    my_friends = bot.friends()
    print(type(my_friends))
    return my_friends


def get_friend_info(my_friends):
    for friend in my_friends:
        remark_name = friend.remark_name
        nick_name = friend.nick_name
        sex = friend.sex
        province = friend.province
        city = friend.city
        signature = friend.signature
        yield {
            '朋友备注名': remark_name,
            '朋友昵称': nick_name,
            '朋友性别': sex,
            '朋友省份': province,
            '朋友城市': city,
            '朋友签名': signature,
            '统计时间': datetime.now().strftime('%Y%m%d%H%M%S%f')
        }


'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
写入txt文件:
    f.closed：ture表示文件已经被关闭，否则为False
    f.encoding：文件所使用的编码
    f.newlines：未读取到行分隔符时为None，只有一种行分隔符时为一个字符串，
                当文件有多种类型的行结束符时，则为一个包含所有当前所遇到的行结束的列表
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
def write_txt_file(path,txt):
    with open(path,'a',encoding='gb18030',newline='') as f:
        f.write(txt)
    f.close()
    #print(f.closed,f.encoding,f.newlines)


'''''''''''''''''''''
读取txt文件：
'''''''''''''''''''''
def read_txt_file(path):
    with open(path, 'r', encoding='gb18030') as f:
        return f.read()


'''''
写入表头（标题），可以直接写入一个列表
'''''
def write_csv_header(path, headers):
   with open(path, 'a', encoding='gb18030', newline='') as f:
       f_csv = csv.DictWriter(f, headers)
       f_csv.writeheader()

'''''
写入详细信息，内容从parse_one_page(html)获取，列表类型
'''''
def write_csv_rows(path, headers, rows):
   #写入行，存入信息到csv文件
   with open(path, 'a', encoding='gb18030', newline='') as f:
       f_csv = csv.DictWriter(f, headers)
       f_csv.writerows(rows)



def get_sex_info(my_friends):
    #使用字典数据类型统计男女数量，1表示男性，2表示女性
    sex_dict = {'male':0,'female':0}
    for friend in my_friends:
        if friend.sex == 1:
            sex_dict['male'] += 1
        elif friend.sex == 2:
            sex_dict['female'] += 1


def get_province_info(my_friends):
    #使用字典数据类型统计各个省份好友数量
    province_dict = {'北京': 0, '上海': 0, '天津': 0, '重庆': 0,
    '河北': 0, '山西': 0, '吉林': 0, '辽宁': 0, '黑龙江': 0,
    '陕西': 0, '甘肃': 0, '青海': 0, '山东': 0, '福建': 0,
    '浙江': 0, '台湾': 0, '河南': 0, '湖北': 0, '湖南': 0,
    '江西': 0, '江苏': 0, '安徽': 0, '广东': 0, '海南': 0,
    '四川': 0, '贵州': 0, '云南': 0,
    '内蒙古': 0, '新疆': 0, '宁夏': 0, '广西': 0, '西藏': 0,
    '香港': 0, '澳门': 0}
    for friend in my_friends:
        if friend.province in province_dict.keys():
            province_dict[friend.province] += 1

    #创建一个列表数据类型存储省份好友信息（中间含有字典类型）：生成JSON Array格式数据
    province_data = []
    for key,value in province_dict.items():
        province_data.append({'name':key,'value':value})



def get_signature_info(my_friends):
    for friend in my_friends:
        # 对数据进行清洗，将标点符号等对词频统计造成影响的因素剔除
        pattern = re.compile(r'[一-龥]+')
        filter_data = re.findall(pattern, friend.signature)
        print(filter_data)
        print(os.getcwd())
        write_txt_file('signature.txt', ''.join(filter_data))
        '''''''''''''''''''''''
        将非空列表的值分行存入txt文件：
        if filter_data:
            file = open(path,'w')
            file.write(''.join(filter_data)+'\n')
            file.close()
        '''''''''''''''''''''''''''''

def analyse_data(path):
    #读取存储的txt文件
    content = read_txt_file(path)
    segment = jieba.lcut(content)
    words_df = pd.DataFrame({'segment': segment})
    # 读取stopwords
    stopwords = pd.read_csv("stopwords.txt", index_col=False, quoting=3, sep=" ", names=['stopword'], encoding='utf-8')
    words_df = words_df[~words_df.segment.isin(stopwords.stopword)]
    print(words_df)

def main():
    filename = '胡翠红微信朋友统计' + '.csv'
    headers = ['朋友备注名', '朋友昵称', '朋友性别', '朋友省份', '朋友城市', '朋友签名', '统计时间']
    write_csv_header(filename, headers)
    friends_info = []
    my_friends = login_chat()
    items = get_friend_info(my_friends)
    for item in items:
        friends_info.append(item)
    write_csv_rows(filename, headers, friends_info)

    #get_sex_info(my_friends)
    #get_province_info(my_friends)


if __name__ == '__main__':
    print("目录地址为：" + os.getcwd())
    os.chdir('F:\PythonProject\Pacong')
    print("当前目录地址为：" + os.getcwd())
    main()


